static and dynamic typed programming languages